#include <iostream>
#include "graficos.h"
#include "acumulador.h"
#include "imagen.h"

using namespace std;
using namespace graficos;

Acumulador::Acumulador(){
}
Acumulador::Acumulador(int posx,int posy,int ancho, int alto,int marco,int filas,int columnas,const Color& borde,const Color& fondo){
	
	Matriz aux(filas,columnas);
	
	this->m=aux;
	this->filas=filas;
	this->columnas=columnas;	
	this->ancho=ancho;
	this->alto=alto;
	this->marco=marco;
	this->posx=posx;
	this->posy=posy;
	
	this->fondo.SetColor(fondo.GetR(),fondo.GetG(),fondo.GetB());
	this->borde.SetColor(borde.GetR(),borde.GetG(),borde.GetB());
}

int Acumulador::Filas() const{return this->filas;} 
int Acumulador::Columnas() const{return this->columnas;}
int Acumulador::Alto() const{return this->alto;}
int Acumulador::Ancho() const{return this->ancho;}
int Acumulador::Marco() const{return this->marco;}
int Acumulador::PosX() const{return posx;}
int Acumulador::PosY() const{return posy;}

void Acumulador::Set(int i, int j, int v){this->m.SetMatriz(i,j,v);} 
int Acumulador::Get(int i, int j)const{return this->m.GetMatriz(i,j);}       
int Acumulador::HayLineas(){
	bool lin=true;
	int cont=0;
	//Miro si hay lineas completas
	for(int i=0;i<this->Filas();i++){
		lin=true;
		for(int j=0;j<this->Columnas();j++){
			if(this->Get(i,j)==0) lin=false;
			
		}
		//Si hay lineas completas las borro bajando el resto encima
		if(lin){
			cont++;
			for(int k=i;k>0;k--){
				for(int l=0;l<this->Columnas();l++){
					this->Set(k,l,this->Get(k-1,l));
				
				}
			}
		}
	}
	return cont;

}
//true si el acumulador esta lleno
bool Acumulador::Pierdes()const{
	bool res=false;
	for(int i=0;i<this->Columnas();i++)
		if(this->Get(0,i)!=0) res=true;

	return res;

}
void Acumulador::Pinta(Imagen im[],int num_imagenes)const{	
	//Rectanulo Acumulador
	for(int i=0;i<this->Marco();i++){ 					
	Rectangulo(this->PosY()+i,this->PosX()+i,this->Ancho()-i+this->PosX(),this->Alto()-i+this->PosY(),this->borde.GetR(),this->borde.GetG(),this->borde.GetB());
	}
	
	//Fondo acumulador
	RectanguloR(this->PosX()+this->Marco(),this->PosY()+this->Marco(),this->Ancho()-this->Marco()+this->PosX(),this->Alto()-this->Marco()+this->PosY(),this->fondo.GetR(),this->fondo.GetG(),this->fondo.GetB());
		
	
	//Piezas
	for(int i=0;i<this->Filas();i++){
		for(int j=0;j<this->Columnas();j++){
			if(this->Get(i,j)!=0){
				im[this->Get(i,j)-1].DibujarImagen((im[this->Get(i,j)-1].Ancho()*j)+this->Marco()+this->PosX(),(im[this->Get(i,j)-1].Alto()*i)+this->Marco()+this->PosY()+1);
			}		
		}
	}

	
}
Acumulador& Acumulador::operator=(const Acumulador& acu){
	this->m=acu.m;
	this->posx=acu.posx;
	this->posy=acu.posy;
	this->ancho=acu.ancho;
	this->alto=acu.alto;
	this->marco=acu.marco;
	this->filas=acu.filas;
	this->columnas=acu.columnas;	
	
	this->fondo.SetColor(acu.fondo.GetR(),acu.fondo.GetG(),acu.fondo.GetB());
	this->borde.SetColor(acu.borde.GetR(),acu.borde.GetG(),acu.borde.GetB());
	return *this;
}
Acumulador::~Acumulador (){
} 
                 

